"""
上下文管理模块

负责管理会话中的文件内容和上下文信息。
"""

from typing import Dict, List, Optional


class ContextManager:
    """上下文管理类"""
    
    def __init__(self, max_context_size: int = 8192) -> None:
        """
        初始化上下文管理器
        
        Args:
            max_context_size: 最大上下文大小（字符数）
        """
        self.max_context_size = max_context_size
        self.files: Dict[str, str] = {}
        self.context_history: List[Dict[str, str]] = []
    
    def add_file(self, file_path: str, content: str) -> None:
        """
        添加文件到上下文
        
        Args:
            file_path: 文件路径
            content: 文件内容
        """
        # 检查上下文大小限制
        if len(content) > self.max_context_size:
            # 如果文件过大，只保留前一部分
            content = content[:self.max_context_size] + "\n... (内容已截断)"
        
        self.files[file_path] = content
    
    def remove_file(self, file_path: str) -> None:
        """
        从上下文中移除文件
        
        Args:
            file_path: 文件路径
        """
        if file_path in self.files:
            del self.files[file_path]
    
    def get_file_content(self, file_path: str) -> Optional[str]:
        """
        获取文件内容
        
        Args:
            file_path: 文件路径
            
        Returns:
            文件内容，如果不存在则返回None
        """
        return self.files.get(file_path)
    
    def get_files(self) -> List[str]:
        """
        获取所有文件路径
        
        Returns:
            文件路径列表
        """
        return list(self.files.keys())
    
    def get_all_content(self) -> str:
        """
        获取所有文件内容
        
        Returns:
            合并后的文件内容
        """
        if not self.files:
            return ""
        
        content_parts = []
        for file_path, content in self.files.items():
            content_parts.append(f"文件: {file_path}\n```\n{content}\n```\n")
        
        return "\n".join(content_parts)
    
    def get_context_size(self) -> int:
        """
        获取当前上下文大小
        
        Returns:
            上下文大小（字符数）
        """
        return len(self.get_all_content())
    
    def clear(self) -> None:
        """清空上下文"""
        self.files.clear()
        self.context_history.clear()
    
    def add_to_history(self, prompt: str, response: str) -> None:
        """
        添加到历史记录
        
        Args:
            prompt: 用户提示词
            response: AI响应
        """
        self.context_history.append({
            "prompt": prompt,
            "response": response
        })
        
        # 限制历史记录数量
        if len(self.context_history) > 10:
            self.context_history.pop(0)
    
    def get_history(self) -> List[Dict[str, str]]:
        """
        获取历史记录
        
        Returns:
            历史记录列表
        """
        return self.context_history.copy()
    
    def get_recent_context(self, max_messages: int = 3) -> str:
        """
        获取最近的对话上下文
        
        Args:
            max_messages: 最大消息数量
            
        Returns:
            最近的对话上下文
        """
        if not self.context_history:
            return ""
        
        recent_history = self.context_history[-max_messages:]
        context_parts = []
        
        for item in recent_history:
            context_parts.append(f"用户: {item['prompt']}")
            context_parts.append(f"AI: {item['response']}")
        
        return "\n\n".join(context_parts)
    
    def is_empty(self) -> bool:
        """
        检查上下文是否为空
        
        Returns:
            是否为空
        """
        return len(self.files) == 0 and len(self.context_history) == 0
    
    def get_summary(self) -> Dict[str, any]:
        """
        获取上下文摘要
        
        Returns:
            上下文摘要信息
        """
        return {
            "file_count": len(self.files),
            "files": list(self.files.keys()),
            "context_size": self.get_context_size(),
            "history_count": len(self.context_history),
            "is_empty": self.is_empty()
        }
